/** @page Buffer
*
*@section bufDoc testsection
*
*
*/

/**
@mainpage Compiler
Dies ist die Dokumentation zu dem "Systemprogrammieren"-Labor im WS 2007 / 2008.<br/>
Im folgenden finden Sie eine Einleitung zu den einzelnen Unterprojekten.<br/>

@section scanner Scanner

Der Scanner besteht aus einem Buffer, einem endlichen Automaten und eine Symboltabelle. <br/>Der Buffer Scanner soll anhand einer Grammatik, aus gültigen Lexemen Token erzeugen. Diese werden in einer späteren Aufgabe als Grundlage für einen Parser benötigt.<br/><br/>Der Scanner liest mit Hilfe des Buffers (ScanBuffer) eine Textdatei ein und speist diese Zeichen für Zeichen in den endlichen Automaten (ScannerFSM).<br/>Dieser erkennt gültige Lexeme und trägt so genannte Identifier in die Symboltabelle ein.<br/>Die drei Bestandteile des Scanners werden detailiert unter "Related Pages" aus technischer Sicht beschrieben.
<ul>
<li><a href="buffer.html">Buffer</a></li>
<li><a href="fsm.html">Endlicher Automat</a></li>
<li><a href="symtable.html">Symboltabelle</a></li>
</ul>


@section parser Parser

*/

/** @page Buffer
Token

Der Buffer ist dafür zuständig, dass die einzulesende Datei ordnungsgemäß geöffnet und geschlossen wird. Des weiteren soll er möglichst performant einzelne Zeichen aus der Quelldatei an den endlichen Automat übergeben können. <br/>Damit das gelingt, liest der Buffer eine definierte Anzahl von Zeichen auf einmal ein und speichert diese zwischen. <br/>Hat der endliche Automat alle gespeicherten Zeichen aufgebraucht, liest der Buffer wieder mehrere Zeichen auf einmal ein. Damit der Automat richtig funktionieren kann, muss sichergestellt sein, dass mindestens drei Zeichen erneut eingelesen werden können.<br/>Ein Buffer muss das Interface Buffer implementieren. Dieses besteht aus folgenden Funktionen:<br/><br/>
<ul>
<li>ScanBufferRing::getNextChar()</li>Diese Funktion gibt das nächste, einzelne Zeichen zurück.<li>unsigned int getLine();</li>Diese Funktion gibt die aktuelle Zeilennummer zurück.<li>unsigned int getColumn();</li>Diese Funktion gibt die aktuelle Spaltennummer zurück.<li>void unGetChar();</li>Mit dieser Funktion wird dem Buffer mitgeteilt, dass das letze ausgegebene Zeichen erneut gebraucht wird. Es soll bei dem nächsten Aufruf von <li>getNextChar() ;</li>zurückgegeben werden. Das mehrmalige Aufrufen von unGetChar() ist möglich und setzt den Zeiger auf das letzte Zeichen um die entsprechende Anzahl von Schritten zurück.<li>void openFile(char* filename);</li>	Diese Funktion offnet die angegebene Datei.</ul>Das angegebene Interface wird von Klasse ScanBufferRing implementiert. Das Prinzip dieses Buffers basiert auf zwei Arrays die abwechselnd mit Zeichen aus der Datei gefüllt werden. Die länge der Arrays gibt die Anzahl der Zeichen an, die gleichzeitig eingelesen werden sollen. Es existiert ein Zeiger der auf ein Zeichen innerhalb von beiden Arrays zeigen kann. Dieser steht zu Beginn auf dem ersten Zeichen im ersten Array. Wird die Funktion getNextChar() aufgerufen, wird das Zeichen auf dem der Zeiger zeigt, zurückgegeben und der Zeiger auf das nächste Zeichen versetzt. Dabei läuft der Zeiger immer im Kreis (Ring). Das heißt vom Ende des zweiten Arrays springt der Zeiger wieder auf den Anfang des ersten Arrays. Überschreitet der Zeiger das Ende des ersten Arrays wird das zweite Array (erneut) eingelesen. Analog wird das erste Array erneut eingelesen, wenn der Zeiger das Ende des zweiten Arrays überschreitet.Wird die Funktion unGetChar() aufgerufen, wird der Zeiger um eine Stelle nach hinten verschoben. Läuft der Zeiger dabei über den Anfang des ersten Arrays hinaus, wird er auf das letzte Zeichen im zweiten Array versetzt. Umgekehrt wird er, wenn er über den Anfang des zweiten Arrays hinausläuft, auf das letzte Zeichen im ersten Array versetzt. Insbesondere wird darauf geachtet, dass sich eine solche Grenzüberschreitung gemerkt wird und beim erneuten Überschreiten dieser Grenze (in normaler Richtung), das entsprechend nächste Array nicht neu eingelesen wird.Alle weiteren Funktionen sind trivial und können anhand des Quelltextes leicht nachvollzogen werden.


*@section bufDoc testsection
*
*
*/

/** @page FSM
*
*@section scanDoc testsection
*
*
*/

/** @page Symtable
*
*@section symDoc testsection
*
*
*/